Skip to content

ci: fix three workflow infrastructure bugs (upload-artifact SHA, setup-beam ubuntu24, workflow-linter self-match)#3

Merged
hyperpolymath merged 3 commits into
mainfrom
chore/fix-upload-artifact-sha
May 2, 2026
Merged

ci: fix three workflow infrastructure bugs (upload-artifact SHA, setup-beam ubuntu24, workflow-linter self-match)#3
hyperpolymath merged 3 commits into
mainfrom
chore/fix-upload-artifact-sha

Conversation

@hyperpolymath

@hyperpolymath hyperpolymath commented May 1, 2026

Copy link
Copy Markdown
Owner

Summary

Three independent CI infra fixes, each blocking PR #2 (and any other PR that triggers these workflows).

1. hypatia-scan.yml — bad upload-artifact SHA

actions/upload-artifact@65c79d7f54e76e4e3c7a8f34db0f4ac8b515c478 doesn't resolve to a real ref; every Hypatia run errors with Unable to resolve action ... unable to find version. Repinned to v4.6.2 (ea165f8d65b6e75b540449e92b4886f43607fa02), the current latest v4 series matching the original # v4 intent.

2. hypatia-scan.yml — setup-beam doesn't know ubuntu24

erlef/setup-beam@v1.18.2 predates ubuntu-24.04 and bails with Tried to map a target OS from env. variable 'ImageOS' (got ubuntu24), but failed. Bumped to v1.24.0 (8d44588995e53ce789721e96227122a67826542d); v1.24's README lists ubuntu-24.04 as supported.

3. workflow-linter.yml — SHA-pinned-actions check matches its own comment

The check ran grep -rn "uses:" .github/workflows/ against everything, then expected a 40-char hex pin. Its own explanatory comment # Find any uses: lines that don't have @SHA format survives the filter — there's no SHA — and the check fails on itself. Anchored the regex on leading-whitespace + directive form (^[[:space:]]+uses:[[:space:]]); comments and freeform text no longer match.

Test plan

  • Hypatia Self-Scan reaches the actual scan step on this branch (no Setup Elixir error)
  • Workflow Security Linter passes on this branch
  • Upload-artifact step reachable (i.e., scan completes)
  • After merge, PR feat(stdlib): add fs_*/env_args/format builtins + my-cli argv forwarding #2's workflows resolve cleanly (the antipattern-check vscode-extension/src/extension.ts flag is a separate decision — out of scope for this PR)

🤖 Generated with Claude Code

The pinned SHA 65c79d7f54e76e4e3c7a8f34db0f4ac8b515c478 doesn't exist
in actions/upload-artifact, so the runner errors with "Unable to
resolve action ... unable to find version" and Hypatia scans never
start.

Pinned to v4.6.2 (ea165f8d65b6e75b540449e92b4886f43607fa02), which
is the latest v4 series matching the original `# v4` comment.
Two more CI infra fixes uncovered while sorting PR #2:

* hypatia-scan.yml: setup-beam@v1.18.2 doesn't recognise ImageOS
  ubuntu24, so every Hypatia run aborts with "Tried to map a target
  OS from env. variable 'ImageOS' (got ubuntu24), but failed."
  Bumped to v1.24.0 (8d44588995...), which lists ubuntu-24.04
  support in its README.

* workflow-linter.yml: the SHA-pinned-actions check ran
  `grep -rn "uses:" .github/workflows/`, which matches the linter's
  own explanatory comment `# Find any uses: lines that don't have
  @sha format`. The comment is then flagged as unpinned and the
  check fails on itself. Anchor the regex on leading-whitespace +
  the directive form `^[[:space:]]+uses:[[:space:]]` so comments
  no longer match.
@hyperpolymath hyperpolymath changed the title ci(hypatia): fix unresolvable upload-artifact SHA pin ci: fix three workflow infrastructure bugs (upload-artifact SHA, setup-beam ubuntu24, workflow-linter self-match) May 1, 2026
…rectory

\${{ env.HOME }} resolves the workflow's `env:` block, not the runner's
$HOME, so the previous `working-directory: \${{ env.HOME }}/hypatia`
expanded to /hypatia and the build step failed with
"working directory '/hypatia'. No such file or directory".

Use a shell `cd "$HOME/hypatia"` instead, matching how the Clone and
Run steps already address the path.
@hyperpolymath
hyperpolymath merged commit f340f7b into main May 2, 2026
16 of 18 checks passed
@hyperpolymath
hyperpolymath deleted the chore/fix-upload-artifact-sha branch May 4, 2026 22:18
hyperpolymath added a commit that referenced this pull request May 19, 2026
…64)

#3 isolated commit. ONLY placeholder SPDX lines staged; repo's other
uncommitted WIP deliberately left untouched/unstaged. PLMP/PMLP +
doubled = scaffold artifacts (LICENCE-POLICY.adoc A5), NOT relicensing.
Diff-shape asserted (SPDX-only). Refs standards LICENCE-POLICY.adoc A5.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
hyperpolymath added a commit that referenced this pull request Jun 21, 2026
…ormance; #5 by-design (#121)

## What

Closes the **implementation ⇄ spec coupling** obligations
(`proofs/STATUS.md` §"Implementation ⇄ spec coupling") — making "the
soundness lives in the compiler" literally true, by **differential
conformance against the Coq-extracted verified artifacts** (the honest,
reproducible alternative to an infeasible full Rust-in-Coq refinement
proof).

| # | Coupling | Status |
|---|----------|--------|
| 1 | Rust checker refines Coq `check` (R5) | ✅ conformance-checked |
| 2 | Rust evaluator refines Coq `step` | ✅ conformance-checked |
| 3 | Echo modality wired surface → verified checker | ✅
conformance-checked (verified-core surface) |
| 4 | Rust session runtime refines Coq `cstep` (binary) | ✅
conformance-checked |
| 5 | Concrete `me` surface | ✅ by-design — not a gap |

## Method

The verified Coq functions are extracted to OCaml (`Extract.v`,
`Separate Extraction`) and used as **independent oracles**; the Rust
ports in `crates/my-qtt` are the implementations under test. One harness
(`conformance/run.sh`) generates a random corpus and asserts
byte-identical results. Where the spec is a *relation* (`step`,
`cstep`), a functional mirror is first **proved sound + complete** vs
the relation, then conformance-tested:

- **`Eval.v`** — `step1` + `step1_sound`/`step1_complete` (vs `step`),
axiom-free, in CI.
- **`SessionEval.v`** — `cstep1` + `cstep1_sound`/`cstep1_complete` (vs
`cstep`), axiom-free, in CI.

**60,000 results across 5 seeds agree** (3000 cases × {check, one-step,
normal-form, session-step}); the normal-form pass cross-checks the Rust
substitution against Coq's extracted `subst`, and echo terms (#3) ride
in the corpus.

## Files

- Coq (new, CI-gated): `Eval.v`, `SessionEval.v`; `Extract.v`
(extraction-only, not in suite).
- Harness: `conformance/{oracle.ml,run.sh,README.adoc}`,
`crates/my-qtt/src/bin/conformance_gen.rs`.
- Rust verified-core: `crates/my-qtt/src/{lib.rs (evaluator),session.rs
(new),surface.rs (echo tests)}`.
- `proofs/STATUS.md`: rows #1#5 + new `conformance-checked` vocabulary
+ two mechanised-cores rows.

## Scope / honesty (carried in STATUS.md)

Refinement-by-conformance against the *extracted verified algorithm*,
not a full Rust-in-Coq proof. The *main* `checker.rs` (Hindley) still
doesn't call the verified core by default; echo lacks
conventional-compiler *syntax*; the n-ary `nstep`/`gstep` runtimes are a
larger follow-on. These are explicitly labelled, not hidden.

Requires `coqc` 8.18, `ocamlfind`+`ocamlc`, `cargo` (all in the proof CI
image).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

https://claude.ai/code/session_01BwV2DWsjkBiNP3oscimMLV

---
_Generated by [Claude
Code](https://claude.ai/code/session_01BwV2DWsjkBiNP3oscimMLV)_

---------

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant